当前位置:  开发笔记 > 编程语言 > 正文

`pixel(*copy)[rows] = malloc(cols*sizeof(*copy))需要多少次调用free()?

如何解决《`pixel(*copy)[rows]=malloc(cols*sizeof(*copy))需要多少次调用free()?》经验,为你挑选了1个好方法。

我已经看到了在C99中使用以下表达式分配2D数组的各种建议:

int (*array)[cols] = malloc(rows * sizeof *array);

我想知道三件事:

    整个结构是否在堆上分配?或者这实际上是一堆指针(在堆栈上)指向堆上的数组..?

    分配的内存是否完全连续?

    是否只需要一次调用free(array)来释放整个2D结构?我在某个地方读过这个 - 不记得在哪里 - 它似乎对我有用,但我想明白为什么.

davmac.. 8

(1)整个结构是否在堆上分配?或者这实际上是一堆指针(在堆栈上)指向堆上的数组..?

整个结构(malloc分配的所有内容)都在堆上.

(2)分配的内存是否完全连续?

是的,malloc分配一个连续的存储区域.

(3)是否只需要一个调用free(array)来释放整个2D结构?我在某个地方读过这个 - 不记得在哪里 - 它似乎对我有用,但我想明白为什么.

对,是真的.至于它的原因,为什么它会是其他任何方式?您使用分配单个存储区域malloc,并free用于取消分配先前返回的单个存储区域malloc.

我怀疑你对声明类​​型感到困惑,尽管你没有提到它:

int (*array)[cols]

这意味着array变量变为单个指针(它本身在堆栈上分配)到一个int带有cols元素的数组(由于使用而在堆上分配malloc).将此与更常见的比较:

int *array[cols] 

...而是声明一个指针的一维数组(数组本身将在堆栈上).您可以使用后者创建一个指向数组的数组,方法是在每个元素中存储指向一系列数组的指针(您确实必须单独分配和释放这些数组!).这种结构可以以类似于2D阵列的方式使用,但实际上并不是一回事.

还要记住,C中的指针始终指向数组.所以,即使第一声明声明一个指针指向一个1维阵列,它可以被用来在点的阵列这样的阵列,即,2维数组作为你想要的.实际上,malloc调用为这样的数组分配存储:

malloc(rows * sizeof *array);

这里,sizeof *array是带有cols元素的(单个)1D数组的大小(以字节为单位).当乘以行数时,它产生尺寸为rows× 的2D阵列的存储要求cols.



1> davmac..:

(1)整个结构是否在堆上分配?或者这实际上是一堆指针(在堆栈上)指向堆上的数组..?

整个结构(malloc分配的所有内容)都在堆上.

(2)分配的内存是否完全连续?

是的,malloc分配一个连续的存储区域.

(3)是否只需要一个调用free(array)来释放整个2D结构?我在某个地方读过这个 - 不记得在哪里 - 它似乎对我有用,但我想明白为什么.

对,是真的.至于它的原因,为什么它会是其他任何方式?您使用分配单个存储区域malloc,并free用于取消分配先前返回的单个存储区域malloc.

我怀疑你对声明类​​型感到困惑,尽管你没有提到它:

int (*array)[cols]

这意味着array变量变为单个指针(它本身在堆栈上分配)到一个int带有cols元素的数组(由于使用而在堆上分配malloc).将此与更常见的比较:

int *array[cols] 

...而是声明一个指针的一维数组(数组本身将在堆栈上).您可以使用后者创建一个指向数组的数组,方法是在每个元素中存储指向一系列数组的指针(您确实必须单独分配和释放这些数组!).这种结构可以以类似于2D阵列的方式使用,但实际上并不是一回事.

还要记住,C中的指针始终指向数组.所以,即使第一声明声明一个指针指向一个1维阵列,它可以被用来在点的阵列这样的阵列,即,2维数组作为你想要的.实际上,malloc调用为这样的数组分配存储:

malloc(rows * sizeof *array);

这里,sizeof *array是带有cols元素的(单个)1D数组的大小(以字节为单位).当乘以行数时,它产生尺寸为rows× 的2D阵列的存储要求cols.

推荐阅读
女女的家_747
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有